package com.cndw.kungfu.ext;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 使用XML文件存取可序列化的对象的类
 * 提供保存和读取的方法
 * @author rongjin.zheng
 * @since 2010/8/25
 */
public class ObjectToXMLUtil {

	/**
	 * 把java的可序列化的对象(实现Serializable接口)序列化保存到XML文件里面,
	 * 如果想一次保存多个可序列化对象请用集合进行封装
	 * @param obj要序列化的可序列化的对象
	 * @param fileName带完全的保存路径的文件名
	 * @throws FileNotFoundException指定位置的文件不存在
	 * @throws IOException输出时发生异常
	 * @throws Exception其他运行时异常 
	 */
	public static void objectXmlEncoder(Object obj, String fileName)
			throws FileNotFoundException, IOException, Exception {
		// 创建输出文件
		String url = ObjectToXMLUtil.class.getResource(fileName).getPath();
		File fo = new File(url);
		// 文件不存在,就创建该文件
		if (!fo.exists()) {
			// 先创建文件的目录
			fo.createNewFile();
		}
		// 创建文件输出流
		FileOutputStream fos = new FileOutputStream(fo);
		// 创建XML文件对象输出类实例
		XMLEncoder encoder = new XMLEncoder(fos);
		// 对象序列化输出到XML文件
		encoder.writeObject(obj);
		encoder.flush();
		// 关闭序列化工具
		encoder.close();
		// 关闭输出流
		fos.close();
	}

	/**
	 * 读取由objSource指定的XML文件中的序列化保存的对象,返回的结果经过了List封装
	 * @param objSource带全部文件路径的文件全名
	 * @return 由XML文件里面保存的对象构成的List列表(可能是一个或者多个的序列化保存的对象)
	 * @throws FileNotFoundException指定的对象读取资源不存在
	 * @throws IOException读取发生错误
	 * @throws Exception其他运行时异常发生
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static List objectXmlDecoder(String objSource)
			throws FileNotFoundException, IOException, Exception {
		List objList = new ArrayList();
		XMLDecoder decoder = new XMLDecoder(
				ObjectToXMLUtil.class.getResourceAsStream(objSource));
		Object obj = null;
		try {
			while ((obj = decoder.readObject()) != null) {
				objList.add(obj);
			}
		} catch (ArrayIndexOutOfBoundsException  e) {
		} catch (Exception e) {
			e.printStackTrace();
		}
		decoder.close();
		return objList;
	}

}
